package DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import to.Resultado;
import to.SolicitacaoDeAnalise;
import util.HibernateUtil;
import visao.SolicitacaoDeterminacaoVO;

public class ResultadoDAO {

	public Resultado buscarResultadoPorCodigo(Integer codigo) {

		Resultado resultado = new Resultado();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Resultado.class);
			criteria.add(Restrictions.idEq(codigo));
			resultado = (Resultado) criteria.uniqueResult();

		} catch (Exception e) {

			e.printStackTrace();

		} finally {

			session.close();
		}

		return resultado;

	}

	public List<SolicitacaoDeAnalise> buscarTodas() throws Exception {

		List<SolicitacaoDeAnalise> listaRetorno = null;

		try {

			Session session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session
					.createCriteria(SolicitacaoDeAnalise.class);
			criteria.addOrder(Order.asc("dataEntrada"));
			criteria.add(Restrictions.like("status", "%Em processo%"));
			listaRetorno = (List<SolicitacaoDeAnalise>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaRetorno;

	}

	public SolicitacaoDeAnalise buscarPorCodigo(Integer codigo) {

		Session session = null;
		SolicitacaoDeAnalise s = new SolicitacaoDeAnalise();

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session
					.createCriteria(SolicitacaoDeAnalise.class);
			s = (SolicitacaoDeAnalise) criteria.uniqueResult();

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			session.close();
		}

		return s;

	}

	public List<SolicitacaoDeterminacaoVO> buscarAmostraPorSolicitacao2(
			Integer solicitacao) {

		StringBuilder sql = new StringBuilder();

		sql.append("select distinct a.codigo, a.cultura, a.profundidade, t.descricao, v.descricao, a.gleba, p.nome ");
		sql.append("from amostra a, solicitacaodeterminacao sol, determinacao d, vegetacao v, topografia t, solicitacaodeanalise s, propriedade p ");
		sql.append("where sol.id_amostra = a.codigo ");
		sql.append("and d.codigo = sol.id_determinacao ");
		sql.append("and v.codigo = a.vegetacao_codigo ");
		sql.append("and t.codigo = a.topografia_codigo ");
		sql.append("and s.codigo = sol.solicitacao_codigo ");
		sql.append("and p.codigo = a.propriedade_codigo  ");
		sql.append("and a.`Status` = 'Aguardando Analise' and s.codigo = "+ solicitacao);

		List<SolicitacaoDeterminacaoVO> listaRetorno = new ArrayList<SolicitacaoDeterminacaoVO>();

		try {

			Connection conexao = HibernateUtil.getSessionFactory()
					.openSession().connection();
			PreparedStatement comando = conexao
					.prepareStatement(sql.toString());
			ResultSet resultado = comando.executeQuery();

			while (resultado.next()) {
				SolicitacaoDeterminacaoVO linha = new SolicitacaoDeterminacaoVO();

				linha.setAmostra(resultado.getInt("a.codigo"));
				linha.setCultura(resultado.getObject("a.cultura"));
				linha.setProfundidade(resultado.getObject("a.profundidade"));
				linha.setTopografia(resultado.getObject("t.descricao"));
				linha.setVegetacao(resultado.getObject("v.descricao"));
				linha.setGleba(resultado.getObject("a.gleba"));
				linha.setPropriedade(resultado.getObject("p.nome"));

				linha.setcTC(null);
				linha.sethAL(null);
				linha.setpH(null);
				linha.setpHhAL(null);
				linha.setpH(null);
				linha.setSatAL(null);
				linha.setSatCa(null);
				linha.setSatK(null);
				linha.setSatMg(null);
				linha.setsB(null);
				linha.setvPorCento(null);
				linha.setMo(null);
				linha.setS(null);
				linha.setP(null);
				linha.setK(null);
				linha.setCa(null);
				linha.setMg(null);
				linha.setAl3(null);

				listaRetorno.add(linha);
			}

			conexao.close();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaRetorno;
	}

	public static void main(String[] args) {
		ResultadoDAO dao = new ResultadoDAO();
		dao.buscarAmostraPorSolicitacao2(3);
	}

}
